import {
  createRouter,
  createWebHistory,
  RouteRecordRaw,
  NavigationGuardNext,
  RouteLocationNormalized,
} from "vue-router";

import { getToken } from "@/utils/auth";
import store from "@/store";

// 静态路由，不需要权限验证的路由
const constantRoutes: RouteRecordRaw[] = [
  {
    path: "/login",
    name: "Login",
    component: () => import("@/pages/Login.vue"),
    meta: { requiresAuth: false },
  }
];

const router = createRouter({
  history: createWebHistory(),
  routes: constantRoutes,
});

// 在router/index.ts中
// 添加一个标志位
let routesLoadedInSession = false;

// 路由守卫
router.beforeEach(
  async (
    to: RouteLocationNormalized,
    from: RouteLocationNormalized,
    next: NavigationGuardNext
  ) => {
    const hasToken = !!getToken();

    // 如果目标路由是登录页
    if (to.path === "/login") {
      next();
      return;
    }

    // 如果没有token，重定向到登录页
    if (!hasToken) {
      next("/login");
      return;
    }

    // 如果有token但还没有加载动态路由，先加载动态路由
    if (!store.getters["route/isRoutesLoaded"] && !routesLoadedInSession) {
      routesLoadedInSession = true;
      try {
        // 调用Vuex action加载动态路由
        const success = await store.dispatch("route/loadDynamicRoutes");

        if (success) {
          // 如果是根路径重定向，直接进入目标页面
          if (to.path === "/") {
            next("/dashboard");
          } else {
            console.log("加载完动态路由后，需要重新导航到目标路由，否则可能会找不到");
            // 加载完动态路由后，需要重新导航到目标路由，否则可能会找不到
            next({ ...to, replace: true });
          }
        } else {
          // 如果加载失败，仍然允许访问
          next();
        }
      } catch (error) {
        console.error("路由加载失败:", error);
        next();
      }
      return;
    }

    // 已经加载过动态路由，直接放行
    next();
  }
);

// 路由后置钩子，用于通知主应用更新菜单
// router.afterEach((to) => {
//   // 通知主应用更新菜单
//   if (window.$wujie?.bus) {
//     // 将子应用路径转换为主应用路径
//     const mainAppPath = `/sub${to.path}`;
//     window.$wujie.bus.$emit('child-app:navigate', {
//       path: mainAppPath
//     });
//   }
// });

export default router;
